<template><div><p>本文档最新版为 <a href="https://learnku.com/docs/laravel/10.x" target="_blank" rel="noopener noreferrer">10.x</a>，旧版本可能放弃维护，推荐阅读最新版！</p>
<h2 id="请求周期" tabindex="-1"><a class="header-anchor" href="#请求周期"><span>请求周期</span></a></h2>
<ul>
<li><a href="#introduction">引言</a></li>
<li><a href="#lifecycle-overview">生命周期概述</a>
<ul>
<li><a href="#first-steps">第一步</a></li>
<li><a href="#http-console-kernels">HTTP / 控制台内核</a></li>
<li><a href="#service-providers">服务提供者</a></li>
<li><a href="#routing">路由</a></li>
<li><a href="#finishing-up">收尾</a></li>
</ul>
</li>
<li><a href="#focus-on-service-providers">关注服务提供者</a></li>
</ul>
<h2 id="引言" tabindex="-1"><a class="header-anchor" href="#引言"><span>引言</span></a></h2>
<p>在“现实世界”中使用任何工具时，如果你了解该工具的工作原理，你会更有信心。应用开发也不例外。当你了解你的开发工具如何工作时，你会更加舒适和自信地使用它们。</p>
<p>本文档的目的是为你提供一个关于 Laravel 框架如何工作的良好、高层次的概述。通过更好地了解整个框架，你会觉得一切都不再那么“神奇”，并且在构建你的应用程序时会更加自信。如果你不是立即理解所有的术语，也不要灰心！只要尝试对正在发生的事情有一个基本的了解，随着你探索文档的其他部分，你的知识会不断增长。</p>
<h2 id="生命周期概述" tabindex="-1"><a class="header-anchor" href="#生命周期概述"><span>生命周期概述</span></a></h2>
<h3 id="第一步" tabindex="-1"><a class="header-anchor" href="#第一步"><span>第一步</span></a></h3>
<p>Laravel 应用程序中所有请求的入口点是<code v-pre>public/index.php</code> 文件。你的 web 服务器<code v-pre>（Apache / Nginx）</code>配置将所有请求都指向这个文件。<code v-pre>index.php</code> 文件本身不包含太多代码。相反，它是加载框架其余部分的起点。</p>
<p>index.php 文件加载了 Composer 生成的自动加载器定义，然后从 bootstrap/app.php 中获取 Laravel 应用程序的实例。Laravel 本身采取的第一个行动是创建应用程序的实例/服务容器。<a href="https://learnku.com/docs/laravel/11.x/containermd/16654" target="_blank" rel="noopener noreferrer">服务容器</a>.</p>
<h3 id="http-console-内核" tabindex="-1"><a class="header-anchor" href="#http-console-内核"><span>HTTP / Console 内核</span></a></h3>
<p>接下来，传入的请求将被发送到 HTTP 内核或者 Console 内核。这取决于进入应用的请求类型。应用程序实例的 <code v-pre>handleRequest</code> 或 <code v-pre>handleCommand</code> 方法用于此目的。 这两个内核充当所有请求流经的中心位置。现在，让我们专注于 HTTP 内核，它是 <code v-pre>Illuminate\Foundation\Http\Kernel</code> 的一个实例</p>
<p>HTTP 内核定义了一个将在执行请求之前运行的 <code v-pre>bootstrappers</code> 数组。 这些引导程序用来配置异常处理、配置日志、<a href="https://learnku.com/docs/laravel/11.x/configuration#environment-configuration" target="_blank" rel="noopener noreferrer">检测应用程序环境</a>，并执行在实际处理请求之前需要完成的其他任务。通常，这些类处理你无需担心的内部 Laravel 配置。</p>
<p>HTTP 内核还定义了一个 HTTP 中间件列表，所有请求在被应用程序处理之前都必须通过该列表。这些中间件处理读写 <a href="https://learnku.com/docs/laravel/11.x/session" target="_blank" rel="noopener noreferrer">HTTP session</a> ，确定应用程序是否处于维护模式， <a href="https://learnku.com/docs/laravel/11.x/csrf" target="_blank" rel="noopener noreferrer">校验 CSRF 令牌</a> ，等等。我们接下来会做详细的讨论。</p>
<p>HTTP 内核的 <code v-pre>handle</code> 方法的签名非常简单：它接收 <code v-pre>Request</code> 接口并返回 <code v-pre>Response</code> 接口。把内核想象成一个代表整个应用程序的大黑匣子。向它提供 HTTP 请求，它将返回 HTTP 响应。</p>
<h3 id="服务提供者" tabindex="-1"><a class="header-anchor" href="#服务提供者"><span>服务提供者</span></a></h3>
<p>最重要的内核引导操作之一是为应用程序加载 <a href="https://learnku.com/docs/laravel/11.x/providers" target="_blank" rel="noopener noreferrer">服务提供者</a>。 服务提供者负责引导框架的所有不同组件，例如数据库、队列、验证和路由组件。</p>
<p>Laravel 将遍历这个提供者列表并实例化它们中的每一个。实例化提供程序后，将在所有提供程序上调用 <code v-pre>register</code> 方法。然后，一旦所有的提供者都被注册了，就会对每个提供程序调用 <code v-pre>boot</code> 方法。服务提供者可能依赖于在执行 <code v-pre>boot</code> 方法时注册并可用的每个容器绑定。</p>
<p>本质上，Laravel 提供的每个主要功能都由服务提供者引导和配置。由于它们引导和配置了框架提供的如此多的功能，服务提供者是整个 Laravel 引导过程中最重要的方面。</p>
<p>虽然框架内部使用了数十个服务提供者，但你也可以选择创建自己的服务提供者。你可以在 <code v-pre>bootstrap/providers.php</code> 文件中找到你的应用程序正在使用的用户定义或第三方服务提供者列表。</p>
<h3 id="routing" tabindex="-1"><a class="header-anchor" href="#routing"><span>Routing</span></a></h3>
<p>一旦应用程序完成引导并且所有服务提供者都已注册，<code v-pre>Request</code> 将被传递给路由器进行调度。路由器将请求分发到路由或控制器，并运行任何特定于路由的中间件。</p>
<p>中间件为过滤或检查进入应用程序的 HTTP 请求提供了一种便捷的机制。例如，Laravel 包含一个验证应用程序用户是否已认证的中间件。如果用户未认证，中间件将把用户重定向到登录界面。但是，如果用户经过身份验证，中间件将允许请求进一步进入应用程序。一些中间件被分配给应用程序中的所有路由，如 <code v-pre>PreventRequestsDuringMaintenance</code>，而一些中间件只被分配给特定路由或路由组。你可以通过阅读完整的<a href="https://learnku.com/docs/laravel/11.x/middleware" target="_blank" rel="noopener noreferrer">中间件文档</a>来了解更多关于中间件的信息。</p>
<p>如果请求通过了所有匹配路由分配的中间件，则执行路由或控制器方法，并通过路由的中间件链路返回路由或控制器方法的响应。</p>
<h3 id="最后" tabindex="-1"><a class="header-anchor" href="#最后"><span>最后</span></a></h3>
<p>一旦路由或控制器方法返回一个响应，该响应将通过路由的中间件返回，从而使应用程序有机会修改或检查传出的响应。</p>
<p>最后，一旦响应通过中间件返回，HTTP 内核的 <code v-pre>handle</code> 方法将返回响应对象，并且 <code v-pre>index.php</code> 文件在返回的响应上调用 <code v-pre>send</code> 方法。<code v-pre>send</code> 方法将响应内容发送到用户的 Web 浏览器。至此，我们已经完成了整个 Laravel 请求生命周期的旅程！</p>
<h2 id="关注服务提供者" tabindex="-1"><a class="header-anchor" href="#关注服务提供者"><span>关注服务提供者</span></a></h2>
<p>服务提供者确实是引导 Laravel 应用程序的关键。创建应用程序实例，注册服务提供者，并将请求传递给引导应用程序。就这么简单！</p>
<p>牢牢掌握服务提供者的构建和其对 Laravel 应用处理机制的原理是非常有价值的。你的应用的默认服务提供会存放在 <code v-pre>app/Providers</code> 目录下面。</p>
<p>默认情况下，<code v-pre>AppServiceProvider</code> 是空白的。这里是用于你添加应用自身的引导处理和服务容器绑定的一个非常棒的地方。在大型项目中，你可能希望创建多个服务提供者，每个服务提供者都为应用程序使用的特定服务提供更细粒度的引导。</p>
<blockquote>
<p>本译文仅用于学习和交流目的，转载请务必注明文章译者、出处、和本文链接<br>
我们的翻译工作遵照 <a href="https://learnku.com/docs/guide/cc4.0/6589" target="_blank" rel="noopener noreferrer">CC 协议</a>，如果我们的工作有侵犯到您的权益，请及时联系我们。</p>
</blockquote>
<hr>
<blockquote>
<p>原文地址：<a href="https://learnku.com/docs/laravel/11.x/lifecyclemd/16653" target="_blank" rel="noopener noreferrer">https://learnku.com/docs/laravel/11.x/li...</a></p>
<p>译文地址：<a href="https://learnku.com/docs/laravel/11.x/lifecyclemd/16653" target="_blank" rel="noopener noreferrer">https://learnku.com/docs/laravel/11.x/li...</a></p>
</blockquote>
</div></template>


